const cron = require('node-cron');
const SubscriptionCohortStatsService = require('./subscriptionCohortStatsService.js');

/**
 * 获取所有已配置的产品列表
 */
async function getAllConfiguredProducts() {
    const cohortSrv = new SubscriptionCohortStatsService();
    return await cohortSrv.getAllProductConfigs();
}

/**
 * 每日定时任务 - 根据配置表中的所有产品进行统计
 */
async function executeDailyCohortTask() {
    console.log('开始每日cohort统计任务...');
    const startTime = Date.now();

    try {
        // 获取所有已配置的产品
        const productConfigs = await getAllConfiguredProducts();

        if (productConfigs.length === 0) {
            console.log('警告: 没有找到任何产品配置，跳过统计');
            return;
        }

        console.log(`找到 ${productConfigs.length} 个产品配置，开始统计`);

        const cohortSrv = new SubscriptionCohortStatsService();

        // 按包名分组，避免重复统计
        const pkGroups = {};
        productConfigs.forEach(config => {
            if (!pkGroups[config.pk]) {
                pkGroups[config.pk] = [];
            }
            pkGroups[config.pk].push(config);
        });

        // 分包统计
        for (const [pk, configs] of Object.entries(pkGroups)) {
            console.log(`处理包: ${pk}, 包含 ${configs.length} 个产品配置`);
            await cohortSrv.dailyRepairYesterdayAllCohort([pk], 9999);
        }

        const duration = (Date.now() - startTime) / 1000;
        console.log(`每日cohort统计任务完成！耗时: ${duration}秒`);

    } catch (error) {
        console.error('每日cohort统计任务执行失败:', error);
        throw error;
    }
}

/**
 * 启动定时任务
 */
function startCohortScheduler() {
    console.log('启动cohort统计定时任务调度器...');

    // 每天凌晨1点执行
    const job = cron.schedule('0 3 * * *', async () => {
        console.log(`[${new Date().toISOString()}] 执行每日cohort统计定时任务`);
        try {
            await executeDailyCohortTask();
        } catch (error) {
            console.error('定时任务执行失败:', error);
        }
    }, {
        scheduled: true,
        timezone: "Asia/Shanghai"
    });

    console.log('cohort统计定时任务已启动，将在每天凌晨1点(北京时间)执行');

    return {
        job,
        stop: () => {
            job.stop();
            console.log('cohort统计定时任务已停止');
        },
        start: () => {
            job.start();
            console.log('cohort统计定时任务已启动');
        },
        // 手动执行一次（用于测试）
        executeNow: executeDailyCohortTask
    };
}

module.exports = {
    startCohortScheduler,
    executeDailyCohortTask,
    getAllConfiguredProducts
};